perm filename LONGLN[E,ALS] blob sn#186824 filedate 1975-11-18 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00016 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	NEWDIR, NEWDLP, SKPDSP, NEWDFF, OPUT, OSET, TMPDIR
C00006 00003	MAKDIR, MAKDR0, MAKDR1, MAKDOL, MDOL1
C00008 00004	MDIL1, MDIL1A, MDIL2, MDIL2A, MDCSRC, MDCSR1, MD1DSP
C00010 00005	MDIL1B, MAKDLF, MAKDFF, MDFF2, MDFF3, MDCEOL, MD2DSP
C00014 00006	MD1CR, MD2CR, MD3CR, MD3CR1, MDIL3, MDCRCK, MDFIX, MDLFCK
C00017 00007	CREATE, CREAT2, CTEXT
C00019 00008	RDSPA1,RDPAGE, RDPGOK, RDSPAG, RDPAG0
C00022 00009	RDPAG2, RDPAG1, RDLINE, RDLLP, RDLTAB
C00025 00010	RDLCR, RDLLF, NUMSTR,NUMSIX,OCTSTR,OCTASC
C00028 00011	RDLFF, RDLDON, LINSET, RPDSP, RDLNUL
C00030 00012	RDPGLZ, SOSTST, SOSCHK, SOSCK2, PGMK, PGMK2
C00032 00013	DIRCHK, DIRNEW, DIRNW2, DIRNW1, TXTSHF
C00034 00014	FNDLIN, FNDPAG, FNDLN1, FNDLN2, FNDLN3
C00036 00015	REMPTR FIXPTR FNDPT1 FNDPT2 LPTRTB DPTRTB ARRL TOPWIN LINES FIRPAG CURPAG PAGES
C00039 00016	DIRGET, DIRGL, DGEND, DRGSET
C00041 ENDMK
C⊗;
;NEWDIR, NEWDLP, SKPDSP, NEWDFF, OPUT, OSET, TMPDIR

NEWDIR:	MOVEI DSP,SKPDSP
	MOVSI H,LSPC+NSPEC
	MOVE G,INPNT
NEWDLP:	GETCH2 H,G
	GETCH2 H,G
	JRST NEWDLP

SKPDSP:	JSP C,RDLNUL		;NUL
	PUSHJ P,RLD		;RUBOUT
	JRST NEWDLP		;CR
	JRST NEWDLP		;LF
	JRST NEWDLP		;TAB
	JRST NEWDFF		;FF
	JRST NEWDLP		;ALT

NEWDFF:	SKIPE @DSTFIL+4
	JRST MAKDR0
	SKIPA T,IBLK
	PUSHJ P,WRBUF
	SOJG T,.-1
	JRST MAKDR0

OPUT:	PUSHJ P,WRBUF
OSET:	MOVN A,OCNT
	HRLI B,(A)
	MOVE A,OPNT
	POPJ P,

;Code to handle long lines
LONGER←←-=498			;Lines longer than 498 to be divided.

LONGLN:	SKIPE RDLNGF#
	JRST LONGLZ		;Put a CRLF here
	SETZM TYOPNT
	OUTSTR [ASCIZ/
Line /]
	TYPDEC LINES
	OUTSTR [ASCIZ/ on Page /]
	TYPDEC CURPAG
	OUTSTR [ASCIZ / is too long. /]
	TRNN F,REDNLY		;Are we in readonly?
	JRST LONGLX		;No
	OUTSTR [ASCIZ/
Must go to READWRITE.  Is this OK? /]
	TRZ F,REDNLY
	SETZM RDONLY
LONGLX:	OUTSTR [ASCIZ/ Type Y to continue,
with all long lines split at approx. 500 characters. /]
	PUSHJ P, YESCHK
	JRST LONGLY
	FATAL Line too long for ETV to handle.

LONGLY:	SETOM RDLNGF		;Set bypass flag
	OUTSTR [ASCIZ/WARNING - Lines longer than 120 characters can not be edited.
They may, however be broken up by XJUST or JFILL commands./]
LONGLZ:	TRO F,WRITE		;Core image will differ from disk

	MOVEI I,LONGER
	MOVEI C,15
	JRST @2(DSP)		;Normal exit but not for sure
	JRST RDLCR1		;Insert a CRLF and procede
;MAKDIR, MAKDR0, MAKDR1, MAKDOL, MDOL1

MAKDIR:	MOVE G,INPNT
	MOVEI C,14
MAKDR0:	PUSHJ P,FLSDIR
	SKIPE @DSTFIL+4
	JRST MAKDR1
	MOVE T,[DIR,,DIREND]
	PUSHJ P,DIRAD1
	MOVNI T,=12
	ADDM T,DIRSIZ	;DON'T COUNT THIS TWICE
	MOVEI T,1
	MOVEM T,1(A)
	SKIPA D,A
MAKDR1:	MOVEI D,DIR
	PUSHJ P,ENDSET
	MOVE E,FSEND
MAKDOL:	PUSHJ P,OSET
	HRRI B,
	SKIPN PAGES
	JRST MDOL1
	IDPB C,A
	AOBJN B,.+2
	PUSHJ P,OPUT
MDOL1:	MOVEI E,1(E)
	HRRM E,(D)
LEG	HRLZM D,(E)
	MOVEI D,(E)
	MOVE T,OBLK
LEG	MOVEM T,1(D)
	ADD E,[350700,,LPDESC]
	MOVSI T,(<BYTE (7)11>)
LEG	MOVEM T,(E)
	HRRI B,1
	MOVSI H,LSPC+DSPC+NSPEC
	MOVEI DSP,MD1DSP		;Dispatch table on page 119
	MOVEI I,LONGER			;To count characters for long line test
	SETZM LINES			;So we can report line number if too long
	MOVE T,[440700,,T]
	MOVEM T,INPNT
	SETZM FFLINE#			;Count lines on this page for /F.
	SETZB T,TT
	JSP Q,SOSCHK
;MDIL1, MDIL1A, MDIL2, MDIL2A, MDCSRC, MDCSR1, MD1DSP

MDIL1:	GETCH2 H,G
	IDPB C,A
	AOJP I,LONGLN		;Time for a long-line break
	AOBJN B,.+2
	PUSHJ P,OPUT
LEG	IDPB C,E
	CAIL C,140
	SUBI C,40
	IDPB C,INPNT
	CAIG C,40
	JRST MDCSRC
	PUSH P,C	;YOU HAVE ANOTHER AC?  THEN WE CAN TALK.
	HRRZ C,B	;THIS ALL MAKES SURE SYMBOL IS SHORT ENUF, THEN COMPARES AGAINST
	CAIG C,13	;A LIST OF "COMMENT" AND "SUBTTL" TO REMOVE THEM FROM DIR PAGE.
	JRST [ POP P,C ↔ JRST MDIL1 ]
	POP P,C
MDIL1A:	MOVEI DSP,MD2DSP		;Also set to this table on page 118
	MOVEI T,MD2CR
	MOVEM T,INPNT
MDIL2:	GETCH2 H,G
LEG	IDPB C,E
MDIL2A:	IDPB C,A
	AOJP I,LONGLN		;Time for a long-line break
	AOBJN B,MDIL2
	PUSHJ P,OPUT
	JRST MDIL2

MDCSRC:	PUSHJ P,MDCSR1
	JUMPGE DSP,MDIL1A
	MOVSI E,350700
	HRRI E,LPDESC(D)
	HRRI B,400001
	JRST MDIL1A

MDCSR1:	MOVSI DSP,-NSCOMS
	DPB DSP,INPNT
	CAMN T,SCOMS(DSP)
	CAME TT,SCOMS2(DSP)
	AOBJN DSP,.-2
	POPJ P,

MD1DSP:	JSP C,RDLNUL		;NUL
	PUSHJ P,RLD		;RUBOUT
	JRST MD1CR		;CR
	JRST MAKDLF		;LF
	JFCL			;TAB
	JRST MDFF1		;FF
	MOVEI C,"}"		;ALT
	PUSHJ P,TELL7		;Letter
	JRST MDIL1B		;⊗
;MDIL1B, MAKDLF, MAKDFF, MDFF2, MDFF3, MDCEOL, MD2DSP

MDIL1B:	IDPB C,A
	AOBJN B,.+2
	PUSHJ P,OPUT
	SOJA B,MDIL1

MAKDFF:	TRNN B,-2
	JRST MDFF2
	SETZM LINES			;Start count over on new page
MAKDLF:	ADD G,[70000,,]
	MOVEI C,15
	JRST @2(DSP)

MDFF1:	TRNE B,-2
	JRST MAKDLF
	MOVEI C,15
	PUSHJ P,MDFIX
MDFF4:	MOVEI C,14
MDFF2:

;Here we check to see if it is indeed safe to reformat the file
	TRNN F,REDNLY			;Are we in read only
	SKIPE RLDFLG#			;Has the test been made yet
	JRST .+2			;Yes
	PUSHJ P, RLDCHK			;No, so make test


	JUMPE A,MDFF3
	MOVEM A,OPNT
	MOVE A,D
	PUSHJ P,CLOSO
	MOVE D,A
MDFF3:	TRNN F,EOF
	JRST MAKDOL
	MOVE T,OBLK
	MOVEM T,DIREND+1
	PUSHJ P,GDIRX
	TRO F,DIROK
	TRZ F,FILLUZ
	SKIPN @DSTFIL+4
	TRO F,UPDTXT
	JRST COPYX

MDCEOL:	PUSHJ P,MDCSR1
	TRNE B,-2
	JUMPGE DSP,CPOPJ
	MOVSI E,440700
	HRRI E,LPDESC(D)
	HRRI B,
	POPJ P,

MD2DSP:	JSP C,RDLNUL		;DSP set for this dispatch table on page 121
	PUSHJ P,RLD		;RUBOUT
	JRST @INPNT		;CR
	JRST MAKDLF		;LF
	JFCL			;TAB
	JRST MAKDFF		;FF
	MOVEI C,"}"		;ALT	
	PUSHJ P,TELL7		;LETTER
	SOJA B,MDIL2A		;⊗

;Here we check to see if it is really safe to complete the formatting of the
;file being loaded.

RLDCHK:	SETZM TYOPNT		;Test last time always
	MOVE T,RLDRUB
	JUMPN T,RLDCK2
	SKIPN T,SOSBIN
	POPJ P,			;Seems to be a normal source file
	SETOM RLDFLG		;Inhibit further questions
	SUB T,SOSPAG
	SUB T,SOSLIN
	JUMPN T,RLDCK2		;Not a simple SOS file

	OUTSTR [ASCIZ /
You are formatting an SOS file
/]
RLDCK1:	HRRZ T,EDFIL+3		;Get file PN
	SKIPN T			;If no PPN check alias
	HRRZ T,PPN
	PUSH P,A
	HRRZ A,RPPN		;Check with users name
	CAME T,A
	JRST .+3		;Ask a question
	POP P,A
	POPJ P,			;OK
	OUTSTR [ASCIZ /Are you sure that /]
	PUSH P,B
	PUSH P,C
	HRLZ A,T
	PUSHJ P,PNTYO
	POP P,C
	POP P,B
	POP P,A
	OUTSTR [ASCIZ / will approve? (Y or N) /]
	PUSHJ P,YESCHK
	POPJ P,
RLDCKX:	MOVE P,[-70,,PDL]
	PUSHJ P,ENDFIX
	PUSHJ P,FLSDIR
	JRST FORMT4

	SETZM DIRPT
	SETZM DIRP1
	PUSHJ P,ENDSET
	JRST FORMT4

	
RLDCK2:	SETOM RLDFLG
	MOVE T,SOSLI2
	JUMPN T,RLDCK3
	SKIPN RLDRUB
	POPJ P,
	OUTSTR [ASCIZ /
This file has several special symbols and is probably an XGP or binary file.
Do you really want to garbage it? (Y or N) /]
	SKIPA
RLDCK3:	OUTSTR [ASCIZ /
This may be a binary file that would be hopelessly garbaged by formatting.
Do you really want to format it (Y or N)? /]
	SETOM RLDFLG
RLDASK:	PUSHJ P,YESCHK
	JRST RLDCK1
	JRST RLDCKX
;MD1CR, MD2CR, MD3CR, MD3CR1, MDIL3, MDCRCK, MDFIX, MDLFCK

MD1CR:	IBP INPNT
	PUSHJ P,MDCEOL
MD2CR:	PUSHJ P,MDFIX
	MOVSI H,LSPC+NSPEC
	MOVEI T,MD3CR
	MOVEM T,INPNT
MD3CR:	IDPB C,A
	AOBJN B,.+2
	PUSHJ P,OPUT
	MOVEI C,12
	IDPB C,A
	AOS LINES
	MOVEI I,LONGER
	AOBJN B,.+2
	PUSHJ P,OPUT
	HRRI B,1
	SKIPE EDFIL-2		;Are we inserting FFs for /F mode?
	JRST MD4CR
MD4CR0:	SKIPA DSP,[MDCRCK]	;Table below
MD3CR0:	MOVEI DSP,MD2DSP	;Table on page 120
MD3CR1:	GETCH2 H,G
	MOVEI DSP,MD2DSP
	JSP Q,SOSCK2
MDIL3:	GETCH2 H,G
	IDPB C,A
	AOJP I,LONGLN
	AOBJN B,MDIL3
	PUSHJ P,OPUT
	JRST MDIL3

MD4CR:	AOS DSP,FFLINE		;Count another line on this page.
	CAMGE DSP,EDFIL-2	;Time to insert another FF?
	JRST MD4CR0		;No.
	MOVEI DSP,MDLFCK
	GETCH2 H,G
	CAIE C,12		;Is this the LF we expected?
	JRST MD5CR
	GETCH2 H,G		;Get first character following the CRLF.
MD5CR:	ADD G,[070000,,0]	;Back up byte pointer to save char for next time.
	JRST MDFF4		;Go insert FF.

MDLFCK:	JSP C,RDLNUL
	PUSHJ P,RLD
	JFCL
	JFCL			;LF
	JFCL
	JRST MDFF2		;Got a real FF.
	MOVEI C,"}"

MDCRCK:	JSP C,RDLNUL
	PUSHJ P,RLD
	JRST MD3CR1
	JRST MD3CR0
	JFCL
	JRST MDFF2
	MOVEI C,"}"

MDFIX:	MOVEI T,12
LEG	IDPB C,E
LEG	IDPB T,E
	MOVEI T,177
LEG	IDPB T,E
	ADDI E,2
	MOVSI T,DIRCOD
	FSFIX E,T
	LDB T,[2100,,B]
	ADDI T,2
	MOVEM T,2(D)
	ADDM T,DIRSIZ
	AOS PAGES
	MOVEI I,LONGER
	SETZM LINES
	POPJ P,
;CREATE, CREAT2, CTEXT

CREATE:	TRZ F,COPY
	SKIPN @DSTFIL
	JRST FLOSE
	PUSHJ P,COPCHK
;	LDB T,[1400,,DATBLK]		;MUST FIX ******
;	HRRM T,@DSTFIL+1
;	LDB T,[POINT 12,DATBLK,17]
;	DPB T,[POINT 12,@DSTFIL+2,35]
;	LDB T,[POINT 3,DATBLK,5]
;	DPB T,[POINT 3,@DSTFIL+1,20]

	HLLZS @DSTFIL+1			;Zero entire right half first
	LDB T,[POINT 12,DATBLK,17]	;Now get date
	DPB T,[POINT 12,@DSTFIL+1,35]	;and put it in right half
	LDB T,[POINT 15,DATBLK,17]	;Now get date
	DPB T,[POINT 15,@DSTFIL+1,35]	;and put it in right half
	MOVEI E,@DSTFIL
	PUSHJ P,OPENO
	SKIPE @DSTFIL+4
	JRST CREAT2
	MOVE A,[CTEXT,,OBUF]
	BLT A,OBUF+LCTEXT-1
	SETZM OBUF+LCTEXT
	MOVE A,[OBUF+LCTEXT,,OBUF+LCTEXT+1]
	BLT A,OBUF+377
	MOVSI A,(<BYTE(7)14>)
	MOVEM A,OBUF+200
	OUTPUT DSKO,[-400,,OBUF-1↔0]
CREAT2:	CLOSE DSKO,
	MOVE A,[DSTFIL,,SRCFIL]
	BLT A,SRCFIL+4
	POPJ P,

CTEXT:	ASCII/COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002
C00003 ENDMK
C⊗;
/
LCTEXT←←.-CTEXT
;RDSPA1,RDPAGE, RDPGOK, RDSPAG, RDPAG0

;Fixes up page info for the header and trailer lines
RDSPA1:	SKIPA T,CURPAG
RDSPA2:	MOVEI T,(A)		;Start with the page number
	PUSHJ P,NUMSTD		;Get ASCID equivalent
	MOVEM C,HEDPAG		;Put it on asterisk heading line
	MOVEM C,HED2PG		;and also on dash heading line
	MOVEM C,BOTPG2		;Deposit the page number
	MOVEM C,BOTPG4		;on both asterisk and dash bottom lines
	MOVE T,PAGES		;Now get the total number of pages
 	PUSHJ P,NUMSTD		;Get ASCID equivalent
	TRNN F,DIROK		;Is the directory OK?
	MOVE C,[375000,,1]	;No, so use ? mark with a space in ASCID
	MOVEM C,BOTPG3		;Deposit the total page count
	MOVEM C,BOTPG5		;on both types of bottom line
	POPJ P,

;Note skip return
RDPAGE:	TRZ F,UPDIR+WRITE+XPAGE+EDDIR
	SETZM FFLINE		;Used only with /F switch
	MOVEI I,LONGER		;To count characters in lines
	SETZM RDLNGF		;Flag used in long line code
	MOVE B,A
	CAMGE A,DIRPAG
	HRRO A,DIRPAG
	CAMLE A,PAGES
	HRRO A,PAGES
	JUMPL A,RDPGLZ
	AOS (P)
RDPGOK:	CAMN A,FIRPAG
	JRST RDSPAG
	PUSHJ P,FNDPAG
	JUMPN T,.+2
	MOVEI T,DIR
	MOVSI TT,D1BIT
	IORM TT,2(T)
	EXCH T,DIRP1#
	JUMPE T,.+2
	ANDCAM TT,2(T)
	HRRZM A,FIRPAG
RDSPAG:	PUSHJ P,RDSPA2		;Update page info for header and trailer
	PUSHJ P,CLRWR2
	SETZM CHARS#
	SETZM ROOM
	SETZM RELPGN
	MOVE A,FIRPAG
RDPAG0:	SETZM LINES
	TRNE A,-2
	AOS CHARS	;FF ON MOST PAGES
	MOVE B,A
	PUSHJ P,FNDPAG
	MOVEM A,CURPAG
	MOVE D,T
	EXCH T,DIRPT#
	MOVSI TT,DPBIT
	JUMPE T,.+2
	ANDCAM TT,2(T)
	IORM TT,2(D)
	AOS TT,RELPGN#
	DPB TT,[RPBYTE+2(D)]
	MOVEI T,RLD
	MOVEM T,RLDA#
	CAMN B,DIRPAG
	JRST DRGSET
	JUMPE B,CPOPJ
	CAMLE B,PAGES
	POPJ P,
	MOVEI DSP,RPDSP
	SKIPN A,1(D)
	PUSHJ P,TELLZ
	PUSHJ P,SETI
;RDPAG2, RDPAG1, RDLINE, RDLLP, RDLTAB

	TRNE F,FILLUZ
	SKIPA T,[JSP Q,SOSTST]
RDPAG2:	MOVE T,[SETZB B,TT]
	MOVEM T,RDLINS#
	HRRZ T,(D)
	HRRZ T,1(T)
	SUBI T,(A)
	IMULI T,200*5
	ADDM T,ROOM#
	CAIG B,1
	JRST RDPAG1
	GETCHR
	CAIE C,14
	PUSHJ P,TELLD1
RDPAG1:	MOVSI H,LSPC+NSPEC
	PUSHJ P,ENDSET
	AOS T,A		;MAKE T +
	MOVE G,INPNT
	MOVEI D,PAGE#
	MOVSI E,440700
	HRRI E,LLDESC(A)	;SET UP FOR SSET2
	ILDB C,G
	SKIPGE CTAB(C)
	XCT @CTAB(C)
	DPB C,G		;IN CASE CLOBBERED BY SSET
	ADD G,[70000,,]
	CAIE C,12
	JRST RDLINE
	MOVEM G,NEWPNT
	SOS IBLK
	MOVE G,[441100,,[BYTE (9)15,200]]
RDLINE:	HRRM A,(D)
LEG	HRLZM D,(A)
RDLIN2:	MOVSI E,440700
	HRRI E,LLDESC(A)
	XCT RDLINS	;SETZB B,TT OR JSP Q,SOSTST
RDLLP:	GETCH2 H,G
RDLLP2:
LEG	IDPB C,E
	SKIPL T
	AOJP I,LONGLN		;Test for too-long line
	AOJA B,RDLLP


RDLTAB:
LEG	IDPB C,E
	HRROI D,-10
	IORI D,(B)
	SUB B,D
	ADDI TT,(D)
	MOVEI T,40
	JRST .+11(D)
	REPEAT 10,<LEG	IDPB T,E>
LEG	IDPB C,E
	SUB I,D
	JUMPGE I,LONGLN		;Test for length
	AOJA TT,RDLLP

TELLD1:	SKIPE EDFIL-2
	POPJ P,			;NO warning if in /F
	PUSHJ P,TELLDZ
	ASCIZ /
DIRECTORY POINTER INVALID (NO PAGE MARK HERE) -- PROCEED WITH CAUTION
/
	
TELLDZ:	POP P,40
	OUTSTR @40
	SETOM TELFL2
	TRNE F,REDNLY
	POPJ P,			;Don't tellme if in readonly
	PUSHJ P,FBI
	JRST MACSTP		;Terminate macro expansion.
;RDLCR, RDLLF, NUMSTR,NUMSIX,OCTSTR,OCTASC

RDLCR0:	ADD G,[70000,,]
RDLCR1:	MOVEI C,15		;Long line code on page 124 enters here
RDLCR:	HRROI T,40
	JUMPN B,.+2
LEG	IDPB T,E
LEG	IDPB C,E
	GETCH2 H,G
RDLCR2:	ADD G,[70000,,]
	MOVEI C,12
RDLLF:	JUMPGE T,RDLCR0
LEG	IDPB C,E
	TDZA C,C
LEG	IDPB C,E
	TLNE E,760000
	JRST .-2
	CAIL B,1000-2
	JRST RDLONG
	AOS LINES
	MOVEI I,LONGER		;Reset I after every original CR
	ADDI TT,2(B)
	ADDM TT,CHARS
	DPB TT,[111100,,B]
	HRRZM B,1(A)
	AOS T,TXTNUM#
	MOVEM T,2(A)
	MOVEI D,(A)
	MOVNI E,1(E)
	ADDI E,LLDESC(A)
	HRLI A,(E)
	ADDI A,LLDESC+1
	MOVEI T,1
	IORM T,-1(A)
	AOBJN A,.-1
	MOVSI T,TXTCOD
	FSFIX A,T
	AOJA A,RDLINE

RDLONG:	MOVE T,LLDESC(A)
	CAME T,[ASCII /βββββ/]
	CAMN T,[ASCID /βββββ/]
	JRST RDLIN2
	FATAL LINE MORE THAN 511 CHARS

;Conversion routine for ASCII and ASCID
NUMSTD:	MOVEI C,1		;This entry used if ASCID is required
	MOVE A,[440700,,C]	;and results are left in C
NUMSTR:	IDIVI T,=10		;Converts to DEC ASCII, value in T, pointer in A
	JUMPE T,.+4		;Suppresses leading zeros
	HRLM TT,(P)
	PUSHJ P,NUMSTR
	HLRZ TT,(P)
	ADDI TT,"0"
	IDPB TT,A
	POPJ P,

OCTSTR:	JUMPGE T,.+4
	MOVEI TT,55
	IDPB TT,A
	MOVNS T
	IDIVI T,10		;Represents OCT in ASCII, value in T, pointer in A
	JUMPE T,.+4		;Suppresses leading zeros
	HRLM TT,(P)
	PUSHJ P,.-3
	HLRZ TT,(P)
	ADDI TT,"0"
	IDPB TT,A
	POPJ P,

OCTASC:	PUSH P,C		;Represents OCTAL in ASCII, all zeros shown
	MOVEI C,14		;Value in TT, pointer in A
	MOVEI T,0
	LSHC T,3		
	ADDI T,"0"
	IDPB T,A
	SOJG C,.-4
	POP P,C
	POPJ P,

NUMSIX:	IDIVI T,=10		;Produces six-bit representation of DEC. value
	JUMPE T,.+4
	HRLM TT,(P)
	PUSHJ P,NUMSIX
	HLRZ TT,(P)
	ADDI TT,'0'
	IDPB TT,A
	POPJ P,

;RDLFF, RDLDON, LINSET, RPDSP, RDLNUL

RDLFF:
;	JUMPN B,RDLFF2
	TRNE B,777777		;Replaces JUMPN B,RDLFF2 since left of B is used
	JRST RDLFF2
RDLDON:	HRRZS CHARS
	PUSHJ P,ENDFIX
	HRLM D,BOTSTR
	MOVEI T,BOTSTR
	HRRM T,(D)
	MOVEM G,INPNT
	TRNN F,EDDIR
	PUSHJ P,DIRCHK
	TRNE F,FILLUZ
	PUSHJ P,INSDIR
	PUSHJ P,SETWR3		;Compute bloat number
LINSET:	MOVE T,LINES
	CAMGE T,ARRL
	TLOA F,OFFEND
	TLZ F,OFFEND
	SUB T,SCRSIZ
	ADDI T,3
	ADD T,EXTRA
	JUMPG T,.+3
	MOVEI T,1
	SETOM BOTWIN
	EXCH T,WINMAX#
	CAMN T,WINMAX
	CAIG T,1
	SETOM BOTWIN
	POPJ P,

RDLFF2:	MOVEI C,15
LEG	IDPB C,E
	JRST RDLCR2

;Main dispatch table for testing characters while reading in a page of text
	PUSHJ P,RLD1
RPDSP:	JSP C,RDLNUL
	PUSHJ P,@RLDA
	JUMPGE T,RDLCR
	JRST RDLLF
	JUMPGE T,RDLTAB
	JUMPGE T,RDLFF
	MOVEI C,"}"

repeat 1,<
;Dispatch table to test the characters after finding a pseudp FF position
	PUSHJ P,RLD1
RPDSP2:	JSP C,RDLNUL
	PUSHJ P,@RLDA
	JFCL			;CR
	JFCL			;LF
	JFCL			;TAB
	JUMPGE T,SOSTS2		;A real FF here so restore DSP and proceed normally
	MOVEI C,"}"
>

RDLNUL:	SKIPE (G)
	JRST -3(C)
	HRLI G,700
	SKIPN 1(G)
	AOJA G,.-1
	JRST -3(C)
;RDPGLZ, SOSTST, SOSCHK, SOSCK2, PGMK, PGMK2

RDPGLZ:	ANDI A,-1
	TRNE F,DIROK
	JRST RDPGOK
	PUSH P,B
	PUSHJ P,RDPGOK
	PUSHJ P,FLSPAG
	POP P,A
	JRST RDPAGE

SOSTST:	SETZB B,TT
	MOVEI I,LONGER		;Stop at 498 characters
	AOS C,FFLINE		;Get updated line count
	SKIPE EDFIL-2		;Are we in /F mode?
	CAMG C,EDFIL-2		;Are there enough lines on this page?
	JRST SOSCHK		;not time for pseudo FF
	SETZM FFLINE
	MOVEI DSP,RPDSP2	;Special dispatch table on page 126
	GETCH2 H,G
	MOVEI C,14
	ADD G,[70000,,0]
	JUMPGE G,.+2
	SUB G,[430000,,1]
SOSTS2:	SKIPA DSP,[RPDSP]	;Reset usual dispatch but don't pick up character.
;The above SKIPA skips over the first instruction GETCH2 expands to (ILDB C,G).
SOSCHK:	GETCH2 H,G
SOSCK2:	PUSH P,T
	MOVEI T,1
	AOS SOSBIN		;To count total references to SOSCK2
	TDNN T,(G)
	JRST [ POP P,T ↔ JRST 3(Q)]
	POP P,T
	MOVE C,(G)
	CAMN C,[ASCID /     /]
	JRST PGMK
	AND C,[BYTE (7)160,160,160,160,160(1)1]
	CAME C,[ASCID /00000/]
	JRST [AOS SOSLI2↔JRST 2,@[20000,,(Q)]]
	AOS SOSLIN
	AOJA G,.+2
	IBP G
	SKIPGE (G)
	PUSHJ P,RLD
	JRST (Q)

PGMK:	HRLI G,10700
	AOS SOSPAG		;To count SOS pages
	SKIPGE (G)
	PUSHJ P,RLD
PGMK2:	ILDB C,G
	CAIN C,14
	JRST @5(DSP)
	CAIN C,15
	JRST PGMK2
	JRST 1(Q)
;DIRCHK, DIRNEW, DIRNW2, DIRNW1, TXTSHF

DIRCHK:	MOVE A,INPNT
	SUB A,IBFPNT
	ADD A,[70000,,]
	JUMPGE A,.+2
	SUB A,[XOR 1]
	ROT A,-7
	HRR A,IBLK
	HRRZ E,@DIRPT
	SKIPN 1(E)
	JRST DIRNEW
	CAME A,1(E)
	PUSHJ P,TELLD2
;	CAME A,1(E)
;	PUSHJ P,MAP		;Report storage map in this case
	POPJ P,

TELLD2:	PUSHJ P,TELLDZ	;On page 124, reports message, calls FBI, pops back above
	ASCIZ /
** DIRECTORY TROUBLE! **  If wrong page shows, DO NOT edit this page.
  Give command to switch to page number shown at top.
/
;	ASCIZ /
; NEXT DIRECTORY POINTER INVALID -- PROCEED WITH CAUTION
; /

DIRNEW:	TRNN F,EOF
	JRST DIRNW1
	TRO F,DIROK
DIRNW2:	MOVEM A,1(E)
	POPJ P,

DIRNW1:	MOVE T,DIRPT
	CAIE E,DIREND
	JRST DIRNW2
	PUSHJ P,DIRADD
	JRST DIRCHK

TXTSHF:	PUSHJ P,LSTSHF
	MOVE T,2(A)
	TLNE T,ARRBIT
	ADDM C,ARRLIN
	TLNE T,WINBIT
	ADDM C,WINLIN
	JUMPGE T,CPOPJ
	ADDI A,LLDESC+LPMTXT
	MOVE T,1(A)
	TRNN T,-1
	HRRI T,XPLSTE
	PUSHJ P,LSTSH1
	SUBI A,LLDESC+LPMTXT
	POPJ P,
;FNDLIN, FNDPAG, FNDLN1, FNDLN2, FNDLN3

FNDPAG:	MOVE T,ARRL
	HRL T,CURPAG
	CAME A,CURPAG
	MOVEM T,LSTPLC#			;Remember page and line we came from.
	SKIPA T,[DPTRTB,,DPTRT2]
FNDLIN:	MOVE T,[LPTRTB,,LPTRT2]
	HLRM T,FNDPT1
	HRRM T,FNDPT2
	MOVE T,-1(T)
	HRLOI TT,377777
	MOVEM TT,FNDTM1#
FNDLN1:	MOVEI TT,(A)
	SUB TT,@FNDPT1
	MOVM TT,TT
	CAMGE TT,FNDTM1
	SKIPN @FNDPT2	;IGNORE IF PNTR NOT SET
	AOBJN T,FNDLN1
	JUMPGE T,FNDLN2
	MOVEM TT,FNDTM1
	MOVEM T,FNDTM2#
	AOBJN T,FNDLN1
FNDLN2:	MOVE T,FNDTM2
	MOVEI TT,(A)
	SUB TT,@FNDPT1
	ADD T,FNDPT2
	XCT (T)
	JUMPE TT,CPOPJ
	SETZM FNDPAD#		;Fndpag direction for TELLME
	JUMPL TT,FNDLN3
	SETOM FNDPAD		;Ditto
	HRRZ T,(T)
	SOJG TT,.-1
	POPJ P,

FNDLN3:	HLRZ T,(T)
	AOJL TT,.-1
	POPJ P,
;REMPTR FIXPTR FNDPT1 FNDPT2 LPTRTB DPTRTB ARRL TOPWIN LINES FIRPAG CURPAG PAGES

;This AND's the complement of ARRBIT into the left half of (location  in ARRLIN)+1 
;  if ARRLIN is non-zero and sets ARRLIN to zero
;Also AND's the complement of WIMBIT into the left half of (location in WINLIN)+1
;  if WINLIN is non-zero and sets WINLIN to zero.
REMPTR:	FOR @! X IN(ARR,WIN)
{	MOVSI TT,X!BIT
	SKIPE T,X!LIN
	ANDCAM TT,1(T)
	SETZM X!LIN
}	POPJ P,

;This fixes the pointers in the data for the line in question
;  The location in ARRL is used by FINLIN to update ARRLIN and to compute the
;  value which is ORed into the location 1 beyond that in ARRLIN.
;  The location in WINL is similarly used to update WINLIN and to compute the
;  value which is ORed into the location 1 beyond that in WINLIN.
FIXPTR:	FOR @! X IN(ARR,WIN)
{	MOVE A,X!L
	PUSHJ P,FNDLIN
	MOVEM T,X!LIN
	MOVSI TT,X!BIT
	IORM TT,1(T)
}	POPJ P,

IMPURE
FNDPT1:	(T)
FNDPT2:	@(T)

LPTRTB←←.
ARRL:	0
TOPWIN:	0
	1
LINES:	0
	LPTRTB-.,,
LPTRT2:	HRRZ T,ARRLIN
	HRRZ T,WINLIN
	HRRZ T,PAGE
	HLRZ T,BOTSTR

WINL←←TOPWIN		;FOR FIXPTR

DPTRTB←←.
CURPAG:	0		;Number of last in-core page (usually same as FIRPAG)
FIRPAG:	0		;Number of first in-core page
	1
PAGES:	0		;Number of last page in the file
	DPTRTB-.,,
DPTRT2:	HRRZ T,DIRPT
	HRRZ T,DIRP1
	HRRZ T,DIR
	HLRZ T,DIREND
PURE
;DIRGET, DIRGL, DGEND, DRGSET

DIRGET:	HRRZ T,DIR
	MOVEM T,DIRGPT#	;BETTER THE HELL NOT CAUSE SHUFFLAGE
	SETZM DIRGPG#
	MOVE C,[170700,,DIRHED+3]
	MOVEM C,INPNT
	MOVE C,PAGES
	PUSHJ P,NUM5
	MOVE C,[440700,,DIRHED]
	JSP Q,RLDX
	SKIPE VBUF
	SKIPA C,[440700,,VBUF]
	MOVE C,[440700,,[BYTE (7)15,12,177]]
	JSP Q,RLDX
	MOVE C,[440700,,DIRHD2]
DIRGL:	JSP Q,RLDX
	MOVE C,[350700,,DIRTXT]
	MOVEM C,INPNT
	MOVE C,DIRGPT
	HRRZ C,1(C)
	PUSHJ P,NUM5
	IBP INPNT
	AOS C,DIRGPG
	CAMLE C,PAGES
	JRST DGEND
	PUSHJ P,NUM5
	MOVE C,[440700,,DIRTXT]
	JSP Q,RLDX
	HRRZ C,DIRGPT
	HRRZ Q,(C)
	MOVEM Q,DIRGPT
	ADD C,[440700,,LPDESC]
	JRST DIRGL

DGEND:	MOVEI C,177
	IDPB C,INPNT
	TRNN F,DIROK
	SKIPA C,[440700,,DIRUNK]
	MOVE C,[440700,,DIRTXT]
	JSP Q,RLDX
	MOVE C,[440700,,DIREMK]
	JSP Q,RLDX
	SUB P,[1,,1]
	XCT -1(DSP)

DRGSET:	MOVEI Q,DIRGET
	TRO F,EDDIR
	MOVEI DSP,DGDSP
	PUSHJ P,SETRLD
	MOVEI A,1
	JRST RDPAG2